分类
联系方式
  1. 新浪微博
  2. E-mail

Dart eval:compileIdentifierAsReference

介绍

方法签名:

Reference compileIdentifierAsReference(Identifier id, CompilerContext ctx) {

根据《Dart Analyzer:Identifier》可知,Identifier 有两种类型:SimpleIdentifier 和 PrefixedIdentifier,分别处理。

SimpleIdentifier 编译

SimpleIdentifier 编译方式很简单,直接创建《Dart eval:IdentifierReference》实体容纳即可。

PrefixedIdentifier 编译

PrefixedIdentifier 编译要更加复杂一些。

首先,prefix 中可能包含不只一个(a.b),可能有多个(a.b.c.d),因此首先对 prefix 递归,把一层一层的关系处理好:

final L = compileIdentifier(id.prefix, ctx);

之后进行了两个校验:用于校验 校验1:

if (ctx.instanceDeclarationsMap.containsKey(L.type.file)) {

校验2:

if (!ctx.instanceDeclarationsMap[L.type.file]!.containsKey(L.type.name)) {

如果校验不满足,会抛出两个异常:

  • 'Trying to access ${id.prefix}.$idn on ${L.type}, which is not a class'
  • 'Bridge class ${L.type} does not have method/field/getter/setter "$idn"'